const express = require("express");
const path = require("path");
const serveFavicon = require("serve-favicon");
const cors = require("cors");
const logger = require("morgan");
// const portfinder = require("portfinder");

const { resSendMiddleware, errorHandler } = require("./middleware/index.js"); // 自定义中间件
const token_manager = require("./utils/jwt.js");
const router = require("./router");
const { port } = require("./config");

// 创建服务器
const app = express();

/* 第三方中间件 */
app.use(logger("dev")); // 日志
app.use(cors()); // 注入cors模块解决跨域
app.use(serveFavicon(path.resolve("public/favicon.ico"))); // favicon

/* 内置中间件 */
// 处理post请求体的数据到 req.body
app.use(express.urlencoded({ extended: false })); // 解析form表单提交的数据application/x-www-form-urlencoded
app.use(express.json()); // 解析json数据格式

app.use(express.static(path.join(__dirname, "public"))); // 静态资源
// app.use(express.static(path.resolve("public")));

/* 应用级中间件 */
app.use(resSendMiddleware);

app.use(token_manager.guard()); // 拦截校验//token守卫，每一个路由都验证token合法性，白名单地址无需校验。

/* 路由级中间件 */
app.use("/api", router);

/* 错误处理中间件 */
// 401 错误拦截
app.use(function (err, req, res, next) {
  if (err.name == "UnauthorizedError") {
    console.log(err.name, err.status, err.message);
    res.status(401).json({
      code: 401,
      msg: "登录过期",
      data: null,
    });
  } else {
    next(err);
  }
});

// 统一异常处理中间件
app.use(errorHandler);

// 通过使用portfinder模块，你的Node项目就能够自动选择一个可用的端口号，而不需要手动调整。
// portfinder
//   .getPortPromise()
//   .then((port) => {
//     // 启动服务器
//     app.listen(port, () => {
//       console.log(`服务器在端口${port}上运行: http://localhost:${port}`);
//     });
//   })
//   .catch((err) => {
//     console.error("Error finding available port:", err);
//   });
app.listen(port, () => {
  console.log(`服务器在端口${8889}上运行: http://localhost:${8889}`);
});
